package 代码记录.指定公司代码练习记录.面试手撕2024.幂律科技;

import java.util.ArrayList;
import java.util.List;

public class Test2 {
    static List<String> paths = new ArrayList<>();

    public static void main(String[] args) {
        List<Node> nodes = new ArrayList<>();
        nodes.add(new Node("A", "-1"));
        nodes.add(new Node("A-1", "A"));
        nodes.add(new Node("A-2", "A"));
        nodes.add(new Node("A-3", "A"));
        nodes.add(new Node("A-2-1", "A-2"));
        nodes.add(new Node("A-2-2", "A-2"));
        nodes.add(new Node("A-2-3", "A-2"));
        // Add more nodes here

        buildPaths(nodes, "/"); // Start from the root node with "/"

        System.out.println(paths);
    }

    /**
     * 遍历节点列表,找到根节点（PID == "-1"),然后将根节点路径添加到结果列表中，
     * 并调用 buildSubPaths 方法查找连接到根节点的子节点路径。
     * @param nodes
     * @param path
     */
    private static void buildPaths(List<Node> nodes, String path) {
        for (Node node : nodes) {
            if (node.PID.equals("-1")) {
                paths.add(path + node.ID);
                buildSubPaths(nodes, node, path + node.ID + "/");
            }
        }
    }

    /**
     * 遍历所有节点，查找与给定父节点相连接的子节点，并将这些子节点的路径添加到结果列表中。
     * 然后递归调用自身，以查找这些子节点的子节点路径。
     */
    private static void buildSubPaths(List<Node> nodes, Node parentNode, String parentPath) {
        for (Node node : nodes) {
            if (node.PID.equals(parentNode.ID)) {
                paths.add(parentPath + node.ID);
                buildSubPaths(nodes, node, parentPath + node.ID + "/");
            }
        }
    }

    static class Node {
        String ID; // Node ID
        String PID; // Parent Node ID

        Node(String ID, String PID) {
            this.ID = ID;
            this.PID = PID;
        }
    }
}
